package org.baderlab.csplugins.enrichmentmap.view.heatmap; import java.util.Collection; import java.util.Collections; import java.util.Map; import java.util.Optional; import java.util.concurrent.CompletableFuture; import org.baderlab.csplugins.enrichmentmap.CytoscapeServiceModule.Dialog; import org.baderlab.csplugins.enrichmentmap.model.EnrichmentMap; import org.baderlab.csplugins.enrichmentmap.task.cluster.HierarchicalClusterTask; import org.baderlab.csplugins.enrichmentmap.view.heatmap.HeatMapParams.Distance; import org.baderlab.csplugins.enrichmentmap.view.heatmap.table.RankValue; import org.cytoscape.work.FinishStatus; import org.cytoscape.work.ObservableTask; import org.cytoscape.work.TaskIterator; import org.cytoscape.work.TaskManager; import org.cytoscape.work.TaskObserver; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; public class ClusterRankingOption implements RankingOption { private final TaskManager<?,?> taskManager; private final EnrichmentMap map; private Distance distance = Distance.PEARSON; public interface Factory { ClusterRankingOption create(EnrichmentMap map); } @Inject public ClusterRankingOption(@Assisted EnrichmentMap map, @Dialog TaskManager<?,?> taskManager) { this.map = map; this.taskManager = taskManager; } @Override public String toString() { return "Hierarchical Cluster"; } @Override public String getTableHeaderText() { return "<html>Hierarchical<br>Cluster</html>"; } public void setDistance(Distance distance) { this.distance = distance; } public Distance getDistance() { return distance; } @Override public CompletableFuture<Optional<Map<Integer,RankValue>>> computeRanking(Collection<Integer> genes) { if(genes.size() < 2) { // The HierarchicalClusterTask requires at least 2 genes return CompletableFuture.completedFuture(Optional.of(Collections.emptyMap())); } HierarchicalClusterTask task = new HierarchicalClusterTask(map, genes, distance.getMetric()); CompletableFuture<Optional<Map<Integer,RankValue>>> future = new CompletableFuture<>(); taskManager.execute(new TaskIterator(task), new TaskObserver() { @Override public void taskFinished(ObservableTask task) { if(task instanceof HierarchicalClusterTask) { HierarchicalClusterTask clusterTask = (HierarchicalClusterTask) task; Optional<Map<Integer,RankValue>> ranking = clusterTask.getActualResults(); future.complete(ranking); } } @Override public void allFinished(FinishStatus finishStatus) { // Don't see why this would ever happen if(!future.isDone()) { future.completeExceptionally(new RuntimeException("Failed")); } } }); return future; } }